如果你是第一次阅读这篇文章,以下资源贴可能是你感兴趣的:
R与Python的协作:rpy2简介
Python中使用rpy2模块调用R
在数据分析流程中整合Python和R(一)
在数据分析流程中整合 Python 和 R(二)
rpy2官方文档
为什么要用python调用R,而不选择R调用python呢?一是我可能会需要和别的系统、接口做I/O操作,python显然比R更有优势;二是window系统下不兼容R调用python的rpython
包,也有解决办法但没那么简洁好用。
pycharm中安装rpy2
我用的pycharm是PyCharm Community Edition 2017.1.5,利用File->Settings->Project Interpreter安装ry2包(这是一种类似RStudio的安装package方式)的时候一直提示:
Error: Tried to guess R’s HOME but no command ‘R’ in the PATH.
在环境变量里面添加R的安装文件夹bin,在cmd窗口输入R,是可以得到Rterm窗口的。重新打开pycharm,重新安装仍然报错。后来发现这个包可以通过非官方途径安装,下载一个对应的whl
文件,在cmd输入pip install "D:\R-3.2.1\rpy2-2.8.6-cp36-cp36m-win_amd64.whl"
(请不要直接复制我的路径),可以顺利安装rpy2包。 注意:一定要记住你的包安装的site-packages路径,直到测试rpy2可以正常使用
装好之后在pycharm控制台运行测试,它又报错(环境变量你站出来背锅):
import rpy2.robjects as robjects
RuntimeError: R_USER not defined.
这个问题在Stack Overflow已经被解决,需要在系统环境变量中添加R的主目录路径,另外需要设置R_HOME和R_USER的新建环境变量。总的安装步骤可以总结为:
下载whl文件,利用wlh文件安装rpy2
设置系统环境变量path和新建环境变量R_HOME和R_USER
python中调用R
有两种思路,一是把需要用到的R语句全部封装到一份或者几份R脚本,利用source(xxx.R)
的办法执行R语句。二是把R语句用robjects.xxx
逐句逐句包裹好放入python语句中,前者需要把数据从内存导出转换为R语言可以识别的格式,再利用封装的通过测试的R脚本完成剩下的数据分析任务,速度上比较慢,后续分析中出了问题也不容易控制;后者时刻都在python监控之下容错性好,但是代码更加晦涩不容易写。从稳定可控角度考虑,还是应该选择后者,除非数据分析任务十分简单,不易出错。为了更容易使用rpy2,决定封装常用的R函数,使得书写方式更接近R语言语法格式。
rpy2简介
你可以用以下方式查看rpy2的版本
|
|
R包导入
导入R包通常是编写R代码的第一部分,rpy2提供了rpy2.robjects.packages.importr()
导入R包。
Example
|
|
单行R代码
from rpy2.robjects import r
在上述命令下,有三种方式可以选择:
使用
r.obj
,比如r.c(1, 3)
。
这种方法虽然方便,但是对于名称中有“点号”的函数会出问题,比如data.frame
或者read.csv
等。使用
r['obj']
,比如r['c'](1, 3)
。
这种方法几乎可以调用任何R的函数,而且写法与原始调用很相似,无非是r['func'](value1, para2 = value2)
。
如果一个R函数中的变量名是有“点号”的,不能直接赋值,需要构建一个字典形式,比如r['func'](value1, para2 = value, **{para.3: value3})
。使用
r('obj')
,比如r('c(1, 3)')
。
这种方法从某种程度上讲是万能的,因为总是可以将任意长度的R代码写成一个Python字符串,之后通过r('Rcode')
调用执行。由于对R语言的有一定掌握,我认为这一种表达方式更适合已有的R风格。
多行R代码
更多时候我们需要执行一整段复杂R代码,将每一行R代码嵌入python脚本中非常麻烦,我们往往只需要R中最后的一小部分结果。可以利用python中的'''
封装R语句脚本,传入robjects.r( )函数中。
Example
|
|
在rpy2中创建R向量
创建向量,可以使用rpy2.robjects.vectors
中提供的一系列函数,将一个Python的元组、列表或者字符串转换为R的向量。其中包括 StrVector()
、IntVector()
、FloatVector()
、FactorVector()
和BoolVector()
,分别提供了转换字符、整数、浮点、因子和布尔向量。
创建列表,可以使用ListVector()
将Python的字典转换为R的列表。
创建矩阵和数据框(data.frame
)建议直接使用R函数matrix()
和data.frame()
。尽管如此,rpy2提供了DataFram()
将Python的字典转换成R的数据框(列顺序可能与输入不一致,Python字典特性造成),注意会把字符串自动转换成因子。
以上这些构建的R对象,有一系列的属性和方法,比如names,可以访问和赋值。
|
|
R中的矩阵只是含有维度属性的向量(vectors),可以用以下方式生成:
|
|
绘图
|